package main

// 763. 划分字母区间
func main() {
	s := "ababcbacadefegdehijhklij"
	s = ""
	res := partitionLabels(s)
	for _, xx := range res {
		print(xx, " - ")
	}
}

func partitionLabels(s string) []int {
	// 哈希存储每个字符的次数，然后维护一个Set确保当前片段的值都已经为0了
	var res []int

	byteMap := make(map[rune]int)
	windowMap := make(map[rune]bool)
	for _, ss := range s {
		byteMap[ss]++
	}

	sliceNum := 0
	for _, ss := range s {
		sliceNum++
		byteMap[ss]--
		windowMap[ss] = true
		if byteMap[ss] == 0 {
			delete(windowMap, ss)
			if len(windowMap) == 0 && sliceNum > 0 {
				res = append(res, sliceNum)
				sliceNum = 0
			}
		}
	}
	if sliceNum != 0 {
		res = append(res, sliceNum)
	}

	// 拿到一个窗口
	return res
}

/**
给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段，同一字母最多出现在一个片段中。

注意，划分结果需要满足：将所有划分结果按顺序连接，得到的字符串仍然是 s 。

返回一个表示每个字符串片段的长度的列表。

示例 1：
输入：s = "ababcbacadefegdehijhklij"
输出：[9,7,8]
解释：
划分结果为 "ababcbaca"、"defegde"、"hijhklij" 。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的，因为划分的片段数较少。
示例 2：

输入：s = "eccbbbbdec"
输出：[10]

提示：

1 <= s.length <= 500
s 仅由小写英文字母组成
*/
